home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 1.iso / DEMON / RISCOS2 / TCP_131S.ARC / c / ipcmd < prev    next >
Text File  |  1993-12-22  |  7KB  |  227 lines

  1. /* IP-related user commands */
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. #include "global.h"
  6. #include "mbuf.h"
  7. #include "domain.h"
  8. #include "internet.h"
  9. #include "timer.h"
  10. #include "netuser.h"
  11. #include "iface.h"
  12. #include "ip.h"
  13. #include "cmdparse.h"
  14. #include "icmp.h"
  15. #include "misc.h"
  16.  
  17. extern char badhost[];
  18. struct cmds ipcmds[] = {
  19.         "address",      doipaddr,       0,      NULLCHAR,       NULLCHAR,
  20.         "status",       doipstat,       0,      NULLCHAR,       NULLCHAR,
  21.         "ttl",          dottl,          0,      NULLCHAR,       NULLCHAR,
  22.         NULLCHAR,       NULLFP,         0,
  23.                 "ip subcommands: address status ttl",   NULLCHAR,
  24. };
  25. int doip(int argc, char **argv)
  26. {
  27.         return subcmd(ipcmds,argc,argv);
  28. }
  29. int doipaddr(int argc, char **argv)
  30. {
  31.         int32 n;
  32.  
  33.         if(argc < 2) {
  34.                 cwprintf(NULL, "%s\r\n",inet_ntoa(ip_addr));
  35.         } else if((n = resolve(argv[1])) == 0){
  36.                 cwprintf(NULL, badhost,argv[1]);
  37.                 return 1;
  38.         } else
  39.                 ip_addr = n;
  40.         return 0;
  41. }
  42. int dottl(int argc, char **argv)
  43. {
  44.         if(argc < 2)
  45.                 cwprintf(NULL, "%u\r\n",uchar(ip_ttl));
  46.         else
  47.                 ip_ttl = atoi(argv[1]);
  48.         return 0;
  49. }
  50.  
  51. /* "route" subcommands */
  52. static struct cmds rtcmds[] = {
  53.         "add", doadd, 3,
  54.         "route add <dest addr>[/<bits>] <if name> [gateway] [metric]",
  55.         "Add failed",
  56.  
  57.         "drop", dodrop, 2,
  58.         "route drop <dest addr>[/<bits>]",
  59.         "Not in table",
  60.  
  61.         NULLCHAR, NULLFP, 0,
  62.         "route subcommands: add, drop",
  63.         NULLCHAR, 
  64. };
  65.  
  66. /* Display and/or manipulate routing table */
  67. int doroute(int argc, char **argv)
  68. {
  69.         if(argc < 2){
  70.                 dumproute();
  71.                 return 0;
  72.         }
  73.         return subcmd(rtcmds,argc,argv);
  74. }
  75. /* Add an entry to the routing table
  76.  * E.g., "add 1.2.3.4 ax0 5.6.7.8 3"
  77.  */
  78. int doadd(int argc, char **argv)
  79. {
  80.         struct interface *ifp;
  81.         int32 dest,gateway;
  82.         unsigned bits;
  83.         char *bitp;
  84.         int metric;
  85.  
  86.         if(strcmp(argv[1],"default") == 0){
  87.                 dest = 0;
  88.                 bits = 0;
  89.         } else {
  90.                 if((dest = resolve(argv[1])) == 0){
  91.                         cwprintf(NULL, badhost,argv[1]);
  92.                         return 1;
  93.                 }
  94.  
  95.                 /* If IP address is followed by an optional slash and
  96.                  * a length field, (e.g., 128.96/16) get it;
  97.                  * otherwise assume a full 32-bit address
  98.                  */
  99.                 if((bitp = strchr(argv[1],'/')) != NULLCHAR){
  100.                         bitp++;
  101.                         bits = atoi(bitp);
  102.                 } else
  103.                         bits = 32;
  104.         }
  105.         for(ifp=ifaces;ifp != NULLIF;ifp = ifp->next){
  106.                 if(strcmp(argv[2],ifp->name) == 0)
  107.                         break;
  108.         }
  109.         if(ifp == NULLIF){
  110.                 cwprintf(NULL, "Interface \"%s\" unknown\r\n",argv[2]);
  111.                 return 1;
  112.         }
  113.         if(argc > 3){
  114.                 if((gateway = resolve(argv[3])) == 0){
  115.                         cwprintf(NULL, badhost,argv[3]);
  116.                         return 1;
  117.                 }
  118.         } else {
  119.                 gateway = 0;
  120.         }
  121.         if(argc > 4)
  122.                 metric = atoi(argv[4]);
  123.         else
  124.                 metric = 0;
  125.  
  126.         rt_add(dest,bits,gateway,metric,ifp);
  127.         return 0;
  128. }
  129. /* Drop an entry from the routing table
  130.  * E.g., "drop 128.96/16
  131.  */
  132. int dodrop(int argc, char **argv)
  133. {
  134.         char *bitp;
  135.         unsigned bits;
  136.         int32 n;
  137.  
  138.         argc = argc;
  139.  
  140.         if(strcmp(argv[1],"default") == 0){
  141.                 n = 0;
  142.                 bits = 0;
  143.         } else {
  144.                 /* If IP address is followed by an optional slash and length field,
  145.                  * (e.g., 128.96/16) get it; otherwise assume a full 32-bit address
  146.                  */
  147.                 if((bitp = strchr(argv[1],'/')) != NULLCHAR){
  148.                         bitp++;
  149.                         bits = atoi(bitp);
  150.                 } else
  151.                         bits = 32;
  152.  
  153.                 if((n = resolve(argv[1])) == 0){
  154.                         cwprintf(NULL, badhost,argv[1]);
  155.                         return 1;
  156.                 }
  157.         }
  158.         return rt_drop(n,bits);
  159. }
  160.  
  161. /* Dump IP routing table
  162.  * Dest              Length    Interface    Gateway          Metric
  163.  * 192.001.002.003   32        sl0          192.002.003.004       4
  164.  */
  165. int dumproute(void)
  166. {
  167.         register unsigned int i,bits;
  168.         register struct route *rp;
  169.  
  170.         cwprintf(NULL, "Dest              Length    Interface    Gateway          Metric\r\n");
  171.         if(r_default.interface != NULLIF){
  172.                 cwprintf(NULL, "default           0         %-13s",
  173.                  r_default.interface->name);
  174.                 if(r_default.gateway != 0)
  175.                         cwprintf(NULL, "%-17s",inet_ntoa(r_default.gateway));
  176.                 else
  177.                         cwprintf(NULL, "%-17s","");
  178.                 cwprintf(NULL, "%6u\r\n",r_default.metric);
  179.         }
  180.         for(bits=1;bits<=32;bits++){
  181.                 for(i=0;i<NROUTE;i++){
  182.                         for(rp = routes[bits-1][i];rp != NULLROUTE;rp = rp->next){
  183.                                 cwprintf(NULL, "%-18s",inet_ntoa(rp->target));
  184.                                 cwprintf(NULL, "%-10u",bits);
  185.                                 cwprintf(NULL, "%-13s",rp->interface->name);
  186.                                 if(rp->gateway != 0)
  187.                                         cwprintf(NULL, "%-17s",inet_ntoa(rp->gateway));
  188.                                 else
  189.                                         cwprintf(NULL, "%-17s","");
  190.                                 cwprintf(NULL, "%6u\r\n",rp->metric);
  191.                         }
  192.                 }
  193.         }
  194.         return 0;
  195. }
  196.  
  197. int doipstat(int argc, char **argv)
  198. {
  199.         extern struct ip_stats ip_stats;
  200.         extern struct reasm *reasmq;
  201.         register struct reasm *rp;
  202.         register struct frag *fp;
  203.  
  204.         argc = argc;
  205.         argv = argv;
  206.  
  207.         cwprintf(NULL, "IP: total %ld runt %u len err %u vers err %u",
  208.                 ip_stats.total,ip_stats.runt,ip_stats.length,ip_stats.version);
  209.         cwprintf(NULL, " chksum err %u badproto %u\r\n",
  210.                 ip_stats.checksum,ip_stats.badproto);
  211.  
  212.         if(reasmq != NULLREASM)
  213.                 cwprintf(NULL, "Reassembly fragments:\r\n");
  214.         for(rp = reasmq;rp != NULLREASM;rp = rp->next){
  215.                 cwprintf(NULL, "src %s",inet_ntoa(rp->source));
  216.                 cwprintf(NULL, " dest %s",inet_ntoa(rp->dest));
  217.                 cwprintf(NULL, " id %u pctl %u time %lu len %u\r\n",
  218.                         rp->id,uchar(rp->protocol),rp->timer.count,rp->length);
  219.                 for(fp = rp->fraglist;fp != NULLFRAG;fp = fp->next){
  220.                         cwprintf(NULL, " offset %u last %u\r\n",fp->offset,fp->last);
  221.                 }
  222.         }
  223.         doicmpstat();
  224.         return 0;
  225. }
  226.  
  227.